﻿using System.Linq;

/*
 * DG2: LDS technical report 2004, A.13.3 (стр. 49)
 * Facial record: ISO/IEC 19794-5:2005(E) (стр. 6)
 */

namespace Ipmce.RemoteVoting.Common.Tools.CardReader.ImageParsing
{
	public class BiometricInformationManipulator : IBiometricInformationManipulator
	{
        public byte[] CreateSimpleDg2(byte[] image, ImageType imageDataType, int width, int height)
        {
            var dg2 = new Dg2(
                new BiometricInformationGroup(
                    new BiometricInformation(
                        new BiometricHeader(1,
                            // Эти два тэга не являются обязательными для dg2, но пишутся в плюсовом коде
                            new ByteArrayWithTag(BioInfoTags.CbeffBiometricType, new byte[] { 0x02 }),
                            new ByteArrayWithTag(BioInfoTags.CbeffBiometricFeature, new byte[] { 0x00 }),
                            // Только эти два тэга обязательны для dg2. Значения взяты из ISO/IEC 19794-5
                            new ByteArrayWithTag(BioInfoTags.CbeffFormatOwner, new byte[] { 0x01, 0x01 }),
                            new ByteArrayWithTag(BioInfoTags.CbeffFormatType, new byte[] { 0x00,0x08 })),
                        new BiometricData(
                            new FacialRecord(EnumFaceImageType.FullFrontal, imageDataType, width, height, image)))));
            var dg2Raw = new byte[dg2.GetSize()];
            dg2.Write(dg2Raw, 0);

            return dg2Raw;
        }

		public byte[] ParseImage(byte[] dg2Raw, out ImageType imageDataType)
        {
            var dg2 = new Dg2();
            dg2.Parse(dg2Raw, 0);
			imageDataType =
				((FacialRecord) dg2.BioInfoGroup.BioInfoList.First().BioData.BiometricDataBlock).FacialRecordDataList.First().
					ImageInformation.ImageDataType;
			return
				((FacialRecord) dg2.BioInfoGroup.BioInfoList.First().BioData.BiometricDataBlock).FacialRecordDataList.First().
					ImageData;
        }
    }
}